#ifndef CLIENTWINDOW_H
#define CLIENTWINDOW_H

#include <QMainWindow>
#include <QVBoxLayout>
#include <QHBoxLayout>
#include <QLabel>
#include <QPushButton>
#include <QLineEdit>
#include <QComboBox>
#include <QStatusBar>
#include <QMessageBox>
#include <QTimer>
#include <QCloseEvent>
#include <QMenuBar>
#include <QMenu>
#include <QAction>
#include <QToolBar>
#include <QSpinBox>
#include <QCheckBox>
#include <QListWidget>
#include <QGroupBox>
#include <QSplitter>
#include <QTabWidget>
#include <QProgressDialog>
#include <QFileDialog>

#include "screenviewer.h"
#include "../client.h"
#include "../../logging/logger.h"
#include "../../network/lanservice.h"

class ClientWindow : public QMainWindow
{
    Q_OBJECT

public:
    explicit ClientWindow(QWidget *parent = nullptr);
    ~ClientWindow();

    // 连接到远程服务器
    bool connectToServer(const QString &host, quint16 port);

protected:
    void closeEvent(QCloseEvent *event) override;

private slots:
    // 服务器连接相关槽
    void onConnectButtonClicked();
    void onDisconnectButtonClicked();
    void onConnectionStatusChanged(bool connected);
    
    // 认证相关槽
    void onAuthenticateButtonClicked();
    void onAuthenticationResult(bool success, const QString &message);
    
    // 屏幕数据相关槽
    void onScreenDataUpdated(const QByteArray &imageData, int width, int height);
    
    // 鼠标键盘事件转发槽
    void onMousePressed(int x, int y, int button);
    void onMouseReleased(int x, int y, int button);
    void onMouseMoved(int x, int y);
    void onKeyPressed(int key);
    void onKeyReleased(int key);
    
    // 刷新控制槽
    void onRefreshRateChanged(int fps);
    void onAutoRefreshToggled(bool enabled);
    void onRequestScreenUpdate();
    
    // 缩放模式变更槽
    void onScaleModeChanged(int index);
    
    // 错误处理槽
    void onErrorOccurred(const QString &errorMsg);
    
    // 局域网发现服务槽
    void onStartLANDiscovery();
    void onStopLANDiscovery();
    void onServerDiscovered(const QString &serverAddress, quint16 serverPort, const QString &serverName);
    void onServerLost(const QString &serverAddress, quint16 serverPort);
    void onLANServerSelected(QListWidgetItem *item);
    void onRefreshLANServers();
    
    // 文件传输相关槽
    void onSendFileAction();
    void onReceiveFileAction();

private:
    // UI组件
    QWidget *centralWidget;
    QVBoxLayout *mainLayout;
    
    // 连接部分
    QWidget *connectionWidget;
    QHBoxLayout *connectionLayout;
    QLabel *hostLabel;
    QLineEdit *hostEdit;
    QLabel *portLabel;
    QSpinBox *portSpinBox;
    QPushButton *connectButton;
    QPushButton *disconnectButton;
    
    // 认证部分
    QWidget *authWidget;
    QHBoxLayout *authLayout;
    QLabel *usernameLabel;
    QLineEdit *usernameEdit;
    QLabel *passwordLabel;
    QLineEdit *passwordEdit;
    QPushButton *authButton;
    
    // 控制部分
    QWidget *controlWidget;
    QHBoxLayout *controlLayout;
    QLabel *refreshRateLabel;
    QSpinBox *refreshRateSpinBox;
    QCheckBox *autoRefreshCheckBox;
    QLabel *scaleModeLabel;
    QComboBox *scaleModeComboBox;
    QPushButton *refreshButton;
    
    // 局域网发现部分
    QGroupBox *lanGroup;
    QVBoxLayout *lanLayout;
    QListWidget *lanServerList;
    QHBoxLayout *lanButtonLayout;
    QPushButton *refreshLANButton;
    QPushButton *connectLANButton;
    
    // 屏幕查看器
    ScreenViewer *screenViewer;
    
    // 客户端对象
    Client *client;
    
    // 局域网服务
    LANService *lanService;
    bool lanDiscoveryActive;
    
    // 状态栏组件
    QLabel *connectionStatusLabel;
    QLabel *serverInfoLabel;
    QLabel *fpsLabel;
    
    // 定时器
    QTimer *refreshTimer;
    QTimer *fpsTimer;
    int frameCount;
    
    // 文件传输进度对话框
    QProgressDialog *fileTransferProgress = nullptr;
    
    // 创建UI
    void setupUi();
    
    // 创建菜单和工具栏
    void createMenus();
    
    // 更新状态栏
    void updateStatusBar();
    
    // 更新FPS显示
    void updateFpsDisplay();
    
    // 更新LAN服务器列表
    void updateLANServerList();
    
    // 配置初始化
    void loadSettings();
    void saveSettings();
};

#endif // CLIENTWINDOW_H 